package com.youyi.utils;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class QRCodeManualGenerator {

    private static final int MODULE_SIZE = 10; // 每个模块的大小
    private static final int VERSION_1_SIZE = 21; // 版本1的尺寸（21x21）

    public static void main(String[] args) {
        String content = "HELLO"; // 要编码的内容
        try {
            generateQRCode(content, "qrcode_manual.png");
            System.out.println("二维码生成成功！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成最简单的二维码
     *
     * @param content 二维码内容
     * @param filePath 输出文件路径
     */
    public static void generateQRCode(String content, String filePath) throws IOException {
        // 将字符串转换为二进制序列
        byte[] dataBytes = content.getBytes();
        boolean[][] qrMatrix = new boolean[VERSION_1_SIZE][VERSION_1_SIZE];

        // 初始化二维码矩阵（所有模块初始设为白色）
        for (int i = 0; i < VERSION_1_SIZE; i++) {
            for (int j = 0; j < VERSION_1_SIZE; j++) {
                qrMatrix[i][j] = false;
            }
        }

        // 添加定位图形（固定的黑色方块）
        addFinderPattern(qrMatrix);

        // 将数据写入二维码矩阵（简单映射，实际应更复杂）
        writeDataToMatrix(dataBytes, qrMatrix);

        // 创建图像并保存
        BufferedImage qrImage = createImageFromMatrix(qrMatrix);
        File imgFile =  new File(filePath);
        if(!imgFile.exists()) imgFile.createNewFile();
        ImageIO.write(qrImage, "png",imgFile);
    }

    /**
     * 添加定位图形（固定的黑色方块）
     */
    private static void addFinderPattern(boolean[][] matrix) {
        int size = matrix.length;
        // 左上角定位图形
        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < 7; j++) {
                matrix[i][j] = true;
            }
        }
        // 右上角定位图形
        for (int i = 0; i < 7; i++) {
            for (int j = size - 7; j < size; j++) {
                matrix[i][j] = true;
            }
        }
        // 左下角定位图形
        for (int i = size - 7; i < size; i++) {
            for (int j = 0; j < 7; j++) {
                matrix[i][j] = true;
            }
        }
    }

    /**
     * 将数据写入二维码矩阵（简单映射）
     */
    private static void writeDataToMatrix(byte[] data, boolean[][] matrix) {
        int index = 0;
        for (byte b : data) {
            for (int i = 0; i < 8 && index < matrix.length * matrix[0].length; i++, index++) {
                int row = index / matrix.length;
                int col = index % matrix.length;
                matrix[row][col] = ((b >> (7 - i)) & 1) == 1;
            }
        }
    }

    /**
     * 根据二维码矩阵创建图像
     */
    private static BufferedImage createImageFromMatrix(boolean[][] matrix) {
        int width = matrix.length * MODULE_SIZE;
        int height = matrix[0].length * MODULE_SIZE;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = image.createGraphics();

        // 绘制背景（白色）
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, width, height);

        // 绘制二维码模块（黑色）
        g2.setColor(Color.BLACK);
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                if (matrix[i][j]) {
                    g2.fillRect(j * MODULE_SIZE, i * MODULE_SIZE, MODULE_SIZE, MODULE_SIZE);
                }
            }
        }

        g2.dispose();
        return image;
    }
}